jQuery(document).ready(function(){

	module("Dates");

	test("Date functions", function() {

		var actual = new Date(2008,11,31,9,48).formatString("0hh12");
		var expected = "09";
		same(actual,expected,'12-hour format (with zero-padding) should return correct result for AM times');
		actual = new Date(2008,11,31,21,48).formatString("0hh12");
		expected = "09";
		same(actual,expected,'12-hour format (with zero-padding) should return correct result for PM times');
		actual = new Date(2008,11,31,9,48).formatString("hh12");
		expected = "9";
		same(actual,expected,'12-hour format (without zero-padding) should return correct result for AM times');
		actual = new Date(2008,11,31,21,48).formatString("hh12");
		expected = "9";
		same(actual,expected,'12-hour format (without zero-padding) should return correct result for PM times');

		actual = new Date(2008,11,31,9,48).formatString("0hh");
		expected = "09";
		same(actual,expected,'24-hour format (with zero-padding) should return correct result for AM times');
		actual = new Date(2008,11,31,21,48).formatString("0hh");
		expected = "21";
		same(actual,expected,'24-hour format (with zero-padding) should return correct result for PM times');
		actual = new Date(2008,11,31,9,48).formatString("hh");
		expected = "9";
		same(actual,expected,'24-hour format (without zero-padding) should return correct result for AM times');
		actual = new Date(2008,11,31,21,48).formatString("hh");
		expected = "21";
		same(actual,expected,'24-hour format (without zero-padding) should return correct result for PM times');

		actual = new Date(2008,0).formatString("mmm");
		expected = "Jan";
		same(actual,expected,'short-month format should return "Jan" for month 0');
		actual = new Date(2008,1).formatString("mmm");
		expected = "Feb";
		same(actual,expected,'short-month format should return "Feb" for month 1');
		actual = new Date(2008,2).formatString("mmm");
		expected = "Mar";
		same(actual,expected,'short-month format should return "Mar" for month 2');
		actual = new Date(2008,3).formatString("mmm");
		expected = "Apr";
		same(actual,expected,'short-month format should return "Apr" for month 3');
		actual = new Date(2008,4).formatString("mmm");
		expected = "May";
		same(actual,expected,'short-month format should return "May" for month 4');
		actual = new Date(2008,5).formatString("mmm");
		expected = "Jun";
		same(actual,expected,'short-month format should return "Jun" for month 5');
		actual = new Date(2008,6).formatString("mmm");
		expected = "Jul";
		same(actual,expected,'short-month format should return "Jul" for month 6');
		actual = new Date(2008,7).formatString("mmm");
		expected = "Aug";
		same(actual,expected,'short-month format should return "Aug" for month 7');
		actual = new Date(2008,8).formatString("mmm");
		expected = "Sep";
		same(actual,expected,'short-month format should return "Sep" for month 8');
		actual = new Date(2008,9).formatString("mmm");
		expected = "Oct";
		same(actual,expected,'short-month format should return "Oct" for month 9');
		actual = new Date(2008,10).formatString("mmm");
		expected = "Nov";
		same(actual,expected,'short-month format should return "Nov" for month 10');
		actual = new Date(2008,11).formatString("mmm");
		expected = "Dec";
		same(actual,expected,'short-month format should return "Dec" for month 12');

		actual = new Date(2008,11,15,11,0).formatString("0mm");
		expected = "00";
		same(actual,expected,'minutes format (with zero-padding) should return "00" for minute 0');
		actual = new Date(2008,11,15,11,5).formatString("0mm");
		expected = "05";
		same(actual,expected,'minutes format (with zero-padding) should return "05" for minute 5');
		actual = new Date(2008,11,15,11,30).formatString("0mm");
		expected = "30";
		same(actual,expected,'minutes format (with zero-padding) should return "30" for minute 30');
		actual = new Date(2008,11,15,11,60).formatString("0mm");
		expected = "00";
		same(actual,expected,'minutes format (with zero-padding) should return "00" for minute 60');
		actual = new Date(2008,11,15,11,0).formatString("mm");
		expected = "0";
		same(actual,expected,'minutes format (without zero-padding) should return "0" for minute 0');
		actual = new Date(2008,11,15,11,5).formatString("mm");
		expected = "5";
		same(actual,expected,'minutes format (without zero-padding) should return "5" for minute 5');
		actual = new Date(2008,11,15,11,30).formatString("mm");
		expected = "30";
		same(actual,expected,'minutes format (without zero-padding) should return "30" for minute 30');
		actual = new Date(2008,11,15,11,60).formatString("mm");
		expected = "0";
		same(actual,expected,'minutes format (without zero-padding) should return "0" for minute 60');

		actual = new Date(2008,11,15,11,1,0).formatString("0ss");
		expected = "00";
		same(actual,expected,'seconds format (with zero-padding) should return "00" for second 0');
		actual = new Date(2008,11,15,11,1,5).formatString("0ss");
		expected = "05";
		same(actual,expected,'seconds format (with zero-padding) should return "05" for second 5');
		actual = new Date(2008,11,15,11,1,30).formatString("0ss");
		expected = "30";
		same(actual,expected,'seconds format (with zero-padding) should return "30" for second 30');
		actual = new Date(2008,11,15,11,1,60).formatString("0ss");
		expected = "00";
		same(actual,expected,'seconds format (with zero-padding) should return "00" for second 60');
		actual = new Date(2008,11,15,11,1,0).formatString("ss");
		expected = "0";
		same(actual,expected,'seconds format (without zero-padding) should return "0" for second 0');
		actual = new Date(2008,11,15,11,1,5).formatString("ss");
		expected = "5";
		same(actual,expected,'seconds format (without zero-padding) should return "5" for second 5');
		actual = new Date(2008,11,15,11,1,30).formatString("ss");
		expected = "30";
		same(actual,expected,'seconds format (without zero-padding) should return "30" for second 30');
		actual = new Date(2008,11,15,11,1,60).formatString("ss");
		expected = "0";
		same(actual,expected,'seconds format (without zero-padding) should return "0" for second 60');

		actual = new Date(2008,11,15,0).formatString("am");
		expected = "am";
		same(actual,expected,'am format should return "am" for pre-noon times (00:00:00)');
		actual = new Date(2008,11,15,8).formatString("am");
		expected = "am";
		same(actual,expected,'am format should return "am" for pre-noon times (08:00:00)');
		actual = new Date(2008,11,15,11,59,59).formatString("am");
		expected = "am";
		same(actual,expected,'am format should return "am" for pre-noon times (11:59:59)');
		actual = new Date(2008,11,15,0).formatString("pm");
		expected = "am";
		same(actual,expected,'pm format should return "am" for pre-noon times (00:00:00)');
		actual = new Date(2008,11,15,8).formatString("pm");
		expected = "am";
		same(actual,expected,'pm format should return "am" for pre-noon times (08:00:00)');
		actual = new Date(2008,11,15,11,59,59).formatString("pm");
		expected = "am";
		same(actual,expected,'pm format should return "am" for pre-noon times (11:59:59)');
		actual = new Date(2008,11,15,12).formatString("am");
		expected = "pm";
		same(actual,expected,'am format should return "pm" for pre-midnight times (12:00:00)');
		actual = new Date(2008,11,15,20).formatString("am");
		expected = "pm";
		same(actual,expected,'am format should return "pm" for pre-midnight times (20:00:00)');
		actual = new Date(2008,11,15,23,59,59).formatString("am");
		expected = "pm";
		same(actual,expected,'am format should return "pm" for pre-midnight times (23:59:59)');
		actual = new Date(2008,11,15,12).formatString("pm");
		expected = "pm";
		same(actual,expected,'pm format should return "pm" for pre-midnight times (12:00:00)');
		actual = new Date(2008,11,15,20).formatString("pm");
		expected = "pm";
		same(actual,expected,'pm format should return "pm" for pre-midnight times (20:00:00)');
		actual = new Date(2008,11,15,23,59,59).formatString("pm");
		expected = "pm";
		same(actual,expected,'pm format should return "pm" for pre-midnight times (23:59:59)');

		actual = new Date(2008,11,15,0).formatString("AM");
		expected = "AM";
		same(actual,expected,'AM format should return "AM" for pre-noon times (00:00:00)');
		actual = new Date(2008,11,15,8).formatString("AM");
		expected = "AM";
		same(actual,expected,'AM format should return "AM" for pre-noon times (08:00:00)');
		actual = new Date(2008,11,15,11,59,59).formatString("AM");
		expected = "AM";
		same(actual,expected,'AM format should return "AM" for pre-noon times (11:59:59)');
		actual = new Date(2008,11,15,0).formatString("PM");
		expected = "AM";
		same(actual,expected,'PM format should return "AM" for pre-noon times (00:00:00)');
		actual = new Date(2008,11,15,8).formatString("PM");
		expected = "AM";
		same(actual,expected,'PM format should return "AM" for pre-noon times (08:00:00)');
		actual = new Date(2008,11,15,11,59,59).formatString("PM");
		expected = "AM";
		same(actual,expected,'PM format should return "AM" for pre-noon times (11:59:59)');
		actual = new Date(2008,11,15,12).formatString("AM");
		expected = "PM";
		same(actual,expected,'AM format should return "PM" for pre-midnight times (12:00:00)');
		actual = new Date(2008,11,15,20).formatString("AM");
		expected = "PM";
		same(actual,expected,'AM format should return "PM" for pre-midnight times (20:00:00)');
		actual = new Date(2008,11,15,23,59,59).formatString("AM");
		expected = "PM";
		same(actual,expected,'AM format should return "PM" for pre-midnight times (23:59:59)');
		actual = new Date(2008,11,15,12).formatString("PM");
		expected = "PM";
		same(actual,expected,'PM format should return "PM" for pre-midnight times (12:00:00)');
		actual = new Date(2008,11,15,20).formatString("PM");
		expected = "PM";
		same(actual,expected,'PM format should return "PM" for pre-midnight times (20:00:00)');
		actual = new Date(2008,11,15,23,59,59).formatString("PM");
		expected = "PM";
		same(actual,expected,'PM format should return "PM" for pre-midnight times (23:59:59)');

		actual = new Date(2007,11,31).formatString("wYYYY");
		expected = "2008";
		same(actual,expected,'week-based four-digit year format should return the year based on the week number');
		actual = new Date(2007,11,31).formatString("wYY");
		expected = "08";
		same(actual,expected,'week-based two-digit year format should return the year based on the week number');
		actual = new Date(2007,11,31).formatString("YYYY");
		expected = "2007";
		same(actual,expected,'four-digit year format should return the correct year');
		actual = new Date(7,11,31).formatString("YYYY");
		expected = "1907";
		same(actual,expected,'four-digit year format should return the correct year based on 20th century');
		actual = new Date(2007,11,31).formatString("YY");
		expected = "07";
		same(actual,expected,'two-digit year format should return the correct year');

		actual = new Date(2008,0).formatString("MMM");
		expected = "January";
		same(actual,expected,'full-month format should return "January" for month 0');
		actual = new Date(2008,1).formatString("MMM");
		expected = "February";
		same(actual,expected,'full-month format should return "February" for month 1');
		actual = new Date(2008,2).formatString("MMM");
		expected = "March";
		same(actual,expected,'full-month format should return "March" for month 2');
		actual = new Date(2008,3).formatString("MMM");
		expected = "April";
		same(actual,expected,'full-month format should return "April" for month 3');
		actual = new Date(2008,4).formatString("MMM");
		expected = "May";
		same(actual,expected,'full-month format should return "May" for month 4');
		actual = new Date(2008,5).formatString("MMM");
		expected = "June";
		same(actual,expected,'full-month format should return "June" for month 5');
		actual = new Date(2008,6).formatString("MMM");
		expected = "July";
		same(actual,expected,'full-month format should return "July" for month 6');
		actual = new Date(2008,7).formatString("MMM");
		expected = "August";
		same(actual,expected,'full-month format should return "August" for month 7');
		actual = new Date(2008,8).formatString("MMM");
		expected = "September";
		same(actual,expected,'full-month format should return "September" for month 8');
		actual = new Date(2008,9).formatString("MMM");
		expected = "October";
		same(actual,expected,'full-month format should return "October" for month 9');
		actual = new Date(2008,10).formatString("MMM");
		expected = "November";
		same(actual,expected,'full-month format should return "November" for month 10');
		actual = new Date(2008,11).formatString("MMM");
		expected = "December";
		same(actual,expected,'full-month format should return "December" for month 12');

		actual = new Date(2008,0).formatString("0MM");
		expected = "01";
		same(actual,expected,'months format (with zero-padding) should return "01" for January');
		actual = new Date(2008,11).formatString("0MM");
		expected = "12";
		same(actual,expected,'months format (with zero-padding) should return "12" for December');
		actual = new Date(2008,12).formatString("0MM");
		expected = "01";
		same(actual,expected,'months format (with zero-padding) should return "01" for month 13');
		actual = new Date(2008,0).formatString("MM");
		expected = "1";
		same(actual,expected,'months format (without zero-padding) should return "1" for January');
		actual = new Date(2008,11).formatString("MM");
		expected = "12";
		same(actual,expected,'months format (without zero-padding) should return "12" for December');
		actual = new Date(2008,12).formatString("MM");
		expected = "1";
		same(actual,expected,'months format (without zero-padding) should return "1" for month 13');

		actual = new Date(2008,0,3).formatString("0WW");
		expected = "01";
		same(actual,expected,'weeks format (with zero-padding) should return "01" for the first Thursday of the year');
		actual = new Date(2008,11,28).formatString("0WW");
		expected = "52";
		same(actual,expected,'weeks format (with zero-padding) should return "52" for the last Sunday of the year');
		actual = new Date(2008,0,1).formatString("WW");
		expected = "1";
		same(actual,expected,'weeks format (without zero-padding) should return "1" for the first day of the year');
		actual = new Date(2008,11,28).formatString("WW");
		expected = "52";
		same(actual,expected,'weeks format (without zero-padding) should return "52" for the last Sunday of the year');

		actual = new Date(2008,0,7).formatString("DDD");
		expected = "Monday";
		same(actual,expected,'full-day format should return "Monday" for the first day of the week');
		actual = new Date(2008,0,8).formatString("DDD");
		expected = "Tuesday";
		same(actual,expected,'full-day format should return "Tuesday" for the second day of the week');
		actual = new Date(2008,0,9).formatString("DDD");
		expected = "Wednesday";
		same(actual,expected,'full-day format should return "Wednesday" for the third day of the week');
		actual = new Date(2008,0,10).formatString("DDD");
		expected = "Thursday";
		same(actual,expected,'full-day format should return "Thursday" for the fourth day of the week');
		actual = new Date(2008,0,11).formatString("DDD");
		expected = "Friday";
		same(actual,expected,'full-day format should return "Friday" for the fifth day of the week');
		actual = new Date(2008,0,12).formatString("DDD");
		expected = "Saturday";
		same(actual,expected,'full-day format should return "Saturday" for the sixth day of the week');
		actual = new Date(2008,0,13).formatString("DDD");
		expected = "Sunday";
		same(actual,expected,'full-day format should return "Sunday" for the seventh day of the week');

		actual = new Date(2008,0,7).formatString("ddd");
		expected = "Mon";
		same(actual,expected,'short-day format should return "Mon" for the first day of the week');
		actual = new Date(2008,0,8).formatString("ddd");
		expected = "Tue";
		same(actual,expected,'short-day format should return "Tue" for the second day of the week');
		actual = new Date(2008,0,9).formatString("ddd");
		expected = "Wed";
		same(actual,expected,'short-day format should return "Wed" for the third day of the week');
		actual = new Date(2008,0,10).formatString("ddd");
		expected = "Thu";
		same(actual,expected,'short-day format should return "Thu" for the fourth day of the week');
		actual = new Date(2008,0,11).formatString("ddd");
		expected = "Fri";
		same(actual,expected,'short-day format should return "Fri" for the fifth day of the week');
		actual = new Date(2008,0,12).formatString("ddd");
		expected = "Sat";
		same(actual,expected,'short-day format should return "Sat" for the sixth day of the week');
		actual = new Date(2008,0,13).formatString("ddd");
		expected = "Sun";
		same(actual,expected,'short-day format should return "Sun" for the seventh day of the week');

		actual = new Date(2008,5,1).formatString("0DD");
		expected = "01";
		same(actual,expected,'days format (with zero-padding) should return "01" for the first day of the month');
		actual = new Date(2008,0,31).formatString("0DD");
		expected = "31";
		same(actual,expected,'days format (with zero-padding) should return "31" for January 31');
		actual = new Date(2008,0,32).formatString("0DD");
		expected = "01";
		same(actual,expected,'days format (with zero-padding) should return "01" for January 32 [sic]');
		actual = new Date(2008,1,29).formatString("0DD");
		expected = "29";
		same(actual,expected,'days format (with zero-padding) should return "29" for February 29, 2008');
		actual = new Date(2009,1,29).formatString("0DD");
		expected = "01";
		same(actual,expected,'days format (with zero-padding) should return "01" for February 29 [sic], 2009');

		actual = new Date(2008,5,1).formatString("DD");
		expected = "1";
		same(actual,expected,'days format (without zero-padding) should return "1" for the first day of the month');
		actual = new Date(2008,0,31).formatString("DD");
		expected = "31";
		same(actual,expected,'days format (without zero-padding) should return "31" for January 31');
		actual = new Date(2008,0,32).formatString("DD");
		expected = "1";
		same(actual,expected,'days format (without zero-padding) should return "1" for January 32 [sic]');
		actual = new Date(2008,1,29).formatString("DD");
		expected = "29";
		same(actual,expected,'days format (without zero-padding) should return "29" for February 29, 2008');
		actual = new Date(2009,1,29).formatString("DD");
		expected = "1";
		same(actual,expected,'days format (without zero-padding) should return "1" for February 29 [sic], 2009');

		actual = new Date(2008,5,1).formatString("DDth");
		expected = "1st";
		same(actual,expected,'day-with-suffix format should return "1st" for the first day of the month');
		actual = new Date(2008,5,2).formatString("DDth");
		expected = "2nd";
		same(actual,expected,'day-with-suffix format should return "2nd" for the second day of the month');
		actual = new Date(2008,5,3).formatString("DDth");
		expected = "3rd";
		same(actual,expected,'day-with-suffix format should return "3rd" for the third day of the month');
		actual = new Date(2008,5,4).formatString("DDth");
		expected = "4th";
		same(actual,expected,'day-with-suffix format should return "4th" for the fourth day of the month');
		actual = new Date(2008,5,11).formatString("DDth");
		expected = "11th";
		same(actual,expected,'day-with-suffix format should return "11th" for the eleventh day of the month');
		actual = new Date(2008,5,21).formatString("DDth");
		expected = "21st";
		same(actual,expected,'day-with-suffix format should return "21st" for the twenty-first day of the month');
		actual = new Date(2008,5,22).formatString("DDth");
		expected = "22nd";
		same(actual,expected,'day-with-suffix format should return "22nd" for the twenty-second day of the month');
		actual = new Date(2008,5,23).formatString("DDth");
		expected = "23rd";
		same(actual,expected,'day-with-suffix format should return "23rd" for the twenty-third day of the month');
		actual = new Date(2008,5,24).formatString("DDth");
		expected = "24th";
		same(actual,expected,'day-with-suffix format should return "24th" for the twenty-fourth day of the month');
		actual = new Date(2008,0,32).formatString("DDth");
		expected = "1st";
		same(actual,expected,'day-with-suffix format should return "1st" for the January 32 [sic]');
	});


	test("Date: formatting", function() {
		var actual = new Date(2007,2,1).formatString("YYYY MMM DD");
		var expected = "2007 March 1";
		same(actual,expected,'Date formatting YYYY MMM DD');
		actual = new Date(2007,2,1).formatString("DD of MMM, YYYY");
		expected = "1 of March, 2007";
		same(actual,expected,'Given a format string including text (such as DD of MMM, YYYY) the date format outputs accordingly.');
		actual = new Date(2008,11,31,23,48,59).formatString("YYYY MMM DD hh:mm ss");
		expected = "2008 December 31 23:48 59";
		same(actual,expected,'Date formatting YYYY MMM DD hh:mm ss');
		actual = new Date(2008,11,31,3,8,9).formatString("0hh hh 0mm mm 0ss ss");
		expected = "03 3 08 8 09 9";
		same(actual,expected,'Date formatting hours, minutes & seconds');
		actual = new Date(2008,11,31,3,8,9).formatString("hh12 0hh12 AM am PM pm");
		expected = "3 03 AM am AM am";
		same(actual,expected,'Date formatting 12-hour (AM)');
		actual = new Date(2008,11,31,15,8,9).formatString("hh12 0hh12 AM am PM pm");
		expected = "3 03 PM pm PM pm";
		same(actual,expected,'Date formatting 12-hour (PM)');
		actual = Date.convertFromYYYYMMDDHHMM("200812312348").toString();
		expected = new Date(Date.UTC(2008,11,31,23,48,0,0)).toString();
		same(actual,expected,'Date convertFromYYYYMMDDHHMM');
	});


	test("Date: information", function() {
		var actual = new Date(2007,2,1,10,0).getAmPm();
		var expected = "am";
		same(actual,expected,'Given an AM time, getAmPm returns am');
		actual = new Date(2007,2,1,13,0).getAmPm();
		expected = "pm";
		same(actual,expected,'Given an PM time, getAmPm returns pm');
		actual = new Date(2007,2,1).daySuffix();
		expected = "st";
		same(actual,expected,'Give a valid date (1st), daySuffix returns the correct day Suffix ');
	});


	test("Date: escaping", function() {
		var actual = new Date(2008,0,31,1,2,3).formatString("Y\\Y\\Y\\Y");
		var expected = "YYYY";
		same(actual,expected,'should not convert escaped four-digit year format');
		actual = new Date(2008,0,31,1,2,3).formatString("Y\\Y");
		expected = "YY";
		same(actual,expected,'should not convert escaped two-digit year format');
	});

	test("Date: conversions", function() {
		same(typeof Date.convertFromYYYYMMDDHHMMSSMMM,"function",'should parse define a function');
		same(typeof Date.convertFromYYYYMMDDHHMMSSMMM("20070228"),"object",'should return an object');

		var actual = Date.convertFromYYYYMMDDHHMMSSMMM();
		ok(actual=="Invalid Date"||isNaN(actual),'should parse null value should be invalid');
		actual = Date.convertFromYYYYMMDDHHMMSSMMM("2006"),
		ok(actual=="Invalid Date"||isNaN(actual),'should parse year only should be invalid');
		actual = Date.convertFromYYYYMMDDHHMMSSMMM("20061"),
		ok(actual=="Invalid Date"||isNaN(actual),'should parse year, short month only should be invalid');
		actual = Date.convertFromYYYYMMDDHHMMSSMMM("200601")
		ok(actual=="Invalid Date"||isNaN(actual),'should parse year,month only should be invalid');

		same(Date.convertFromYYYYMMDDHHMMSSMMM("20070228"),new Date(Date.UTC(2007,1,28)),'should parse date only');
		same(Date.convertFromYYYYMMDDHHMMSSMMM("19691103"),new Date(Date.UTC(1969,10,3)),'should parse 1969 date only');
		same(Date.convertFromYYYYMMDDHHMMSSMMM("2006011"),new Date(Date.UTC(2006,0,1)),'should parse year,month, short day');
		same(Date.convertFromYYYYMMDDHHMMSSMMM("199912079"),new Date(Date.UTC(1999,11,7,9)),'should parse year,month,day short hour');
		same(Date.convertFromYYYYMMDDHHMMSSMMM("1999121712"),new Date(Date.UTC(1999,11,17,12)),'should parse year,month,day,hour');
		same(Date.convertFromYYYYMMDDHHMMSSMMM("199912598"),new Date(Date.UTC(1999,11,59,8)),'should parse year,month,day,hour short mins');
		same(Date.convertFromYYYYMMDDHHMMSSMMM("199912150257"),new Date(Date.UTC(1999,11,15,2,57)),'should parse year,month,day,hour,mins');
		same(Date.convertFromYYYYMMDDHHMMSSMMM("1999121512579"),new Date(Date.UTC(1999,11,15,12,57,9)),'should parse year,month,day,hour,mins,short secs');
		same(Date.convertFromYYYYMMDDHHMMSSMMM("19991215125719"),new Date(Date.UTC(1999,11,15,12,57,19)),'should parse year,month,day,hour,mins,secs');
		same(Date.convertFromYYYYMMDDHHMMSSMMM("199912151257198"),new Date(Date.UTC(1999,11,15,12,57,19,8)),'should parse year,month,day,hour,mins,secs,short milliseconds');
		same(Date.convertFromYYYYMMDDHHMMSSMMM("1999121512571978"),new Date(Date.UTC(1999,11,15,12,57,19,78)),'should parse year,month,day,hour,mins,secs,medium milliseconds');
		same(Date.convertFromYYYYMMDDHHMMSSMMM("19991215125719678"),new Date(Date.UTC(1999,11,15,12,57,19,678)),'should parse year,month,day,hour,mins,secs,long milliseconds');
		same(Date.convertFromYYYYMMDDHHMMSSMMM("1999-12-15.12:57:19.678"),new Date(Date.UTC(1999,11,15,12,57,19,678)),'should parse ignoring punctuation');
		same(Date.convertFromYYYYMMDDHHMMSSMMM("  1999/12/15   12:57:19  678    "),new Date(Date.UTC(1999,11,15,12,57,19,678)),'should parse ignoring whitespace');
		same(Date.convertFromYYYYMMDDHHMMSSMMM("  1999/12/15   12:57:19  678  GMT (BST)  "),new Date(Date.UTC(1999,11,15,12,57,19,678)),'should parse ignoring trailing text');
		same(Date.convertFromYYYYMMDDHHMM("  1999/12/15   12:57:19  678  GMT (BST)  "),new Date(Date.UTC(1999,11,15,12,57,0,0)),'should parse ignoring whitespace, punctuation and trailing text');
		same(Date.convertFromYYYYMMDDHHMM("  1999/12/15   12:57:xx  "),new Date(Date.UTC(1999,11,15,12,57,0,0)),'should parse ignoring whitespace, punctuation and trailing text');
		same(Date.convertFromYYYYMMDDHHMMSS("199912151257xx"),new Date(Date.UTC(1999,11,15,12,57,0,0)),'should parse ignoring trailing text');
		same(Date.convertFromYYYYMMDDHHMMSS("19991215125719"),new Date(Date.UTC(1999,11,15,12,57,19,0)),'should parse including seconds');
		same(Date.convertFromYYYYMMDDHHMMSS("19991215125709"),new Date(Date.UTC(1999,11,15,12,57,9,0)),'should parse including seconds');
		same(Date.convertFromYYYYMMDDHHMMSS("1999121512571"),new Date(Date.UTC(1999,11,15,12,57,1,0)),'should parse including partial seconds');
		var d1 = new Date(Date.UTC(1987,9,29,21,43,57,678));
		var s1 = d1.convertToYYYYMMDDHHMMSSMMM();
		var d2 = Date.convertFromYYYYMMDDHHMMSSMMM(s1);
		var s2 = d2.convertToYYYYMMDDHHMMSSMMM();
		same(s2,s1,'should roundtrip current date from Date.convertToYYYYMMDDHHMMSSMMM');
		same(d1,d2,'should roundtrip current date from Date.convertToYYYYMMDDHHMMSSMMM');
	});
});

